קצת על שרתי smtp ואיך לשלוח דואר מחשבון הgmail שלכם דרך סקריפט php.
מועיל מאוד אם השרת שלכם לא תומך בשליחת מיילים
שליחת אימייל דרך gmail בעזרת php היא לא עניין כה מסובך כפי שזה נשמע.
כשאנחנו שולחים אימייל בעזרת הפונקציה mail() המפענח מתחבר אל תוכנה נוספת, הנקראת שרת smtp, מוסר לו את הבקשה לשלוח אימייל ליעד כזה עם נתונים כאלה ובזה פעולתו הסתיימה. לאחר מכן שרת ה-smtp מבצע את שליחת האימייל בפועל.
שרת smtp פרטי מותקן כיום כמעט על כל שרת של כל חברת איחסון קיימת, שמבצע את עבודתו היטב ובדרך כלל מספיק לכל הפעולות הבסיסיות והמורכבות שנרצה לבצע. מצד אחר להשתמש גם בשרת smtp חיצוני, לדוגמה שרת smtp של gmail. אם האתר שלכם מאוחסן על מחשב שלא מותקן עליו שרת smtp, כמו המחשב הביתי שלכם, או שפשוט החלטתם לא להתקין אחד כזה מסיבות ביצועים, פחד משימוש בו לרעה על ידי משתמשים אחרים במחשב שלכם (במקרה של איחסון משוטף) או מכל סיבה אחרת — תמיד תוכלו להשתמש בשרתים חיצוניים, כמו אלו של גוגל.
פרוטוקל ה-smtp הוא קבוצת הסכמים על איך שרת ה-smtp רוצה לקבל את כל הנתונים. באיזה אופן, סדר, אורך וזמן יש להעביר לו פרמטרים. רשימת ההסכמים הזו ארוכה ולכן לא נממש אותה בעצמנו. ניקח מחלקה קיימת שעושה את העבודה הזו שמה PHPMailer. ניתן להוריד מכאן.
בתוך הארכיב ישנם שלושה קבצי php שמהווים את עצם המערכת.
את שלושת הקבצים האלה יש להעתיק לתיקית השרת של localhost
class.phpmailer.php, class.smtp.php, class.pop3.php
כדי שיהיה לנו יותר נוח, נשים את שלושת הסקריפטים האלה בתיקיה phpmailer
ונשתמש בהם משם.
כעת ניצור קובץ שיהיה אחרי על השליחה בפועל ויראה כך:
<?php
require_once 'phpmailer/class.phpmailer.php'; // מיקום קובץ המחלקה
$mail = new PHPMailer (); // יצירת אובייקט המחלקה (קריאה למחלקה)
// הגדרות כלליות
$mail->SMTPAuth = true; // התחברות לשרת המיילים דורשת הזדהות
$mail->SMTPSecure = "ssl"; // מתחברים בהתחברות מאובטחת
$mail->Host = "smtp.gmail.com"; // כתובת השרת של גוגל
$mail->Port = 465; // פורט השרת של גוגל
$mail->Mailer= "smtp"; // מגדירים למחלקה לשלוח אימייל דרך השרת החיצוני ולא באמצעות פונקציות mail
$mail->SMTPDebug = true; // בפעם הראשונה נריץ את השליחה עם הודעות על מה הולך שם
// אחרי שנראה שהכל עובד - יש למחוק את השורה למעלה
// שם משתמש וסיסמה לחשבון
// CHANGE THIS !!!!!!!!!!!!!!!!!!!!!!!!!!
$mail->Username = "[email protected]";
$mail->Password = "YOURPASSWORD";
// מוען
$mail->FromName = "Mega admin"; // שם - השם שלך
$mail->AddReplyTo ("[email protected]", "Mega admin"); // אם המקבל ילחץ "השב" התשובה שלו תשלח ל
// תוכן ההודעה
$mail->Subject = "Mail subject"; // כותרת המכתב
$mail->Body = "Mail text"; // תוכן המכתב
$mail->IsHTML (true); // שולחים היפרטקסט ולא טקסט רגיל
$mail->CharSet = 'UTF-8'; // קידוד המכתב
// מען
$mail->AddAddress ("[email protected]", "Alex"); //כתובת אימייל אליה יישלח האימייל ושם הנמען
$mail->Send (); //ביצוע השליחה
require_once 'phpmailer/class.phpmailer.php'; // מיקום קובץ המחלקה
$mail = new PHPMailer (); // יצירת אובייקט המחלקה (קריאה למחלקה)
// הגדרות כלליות
$mail->SMTPAuth = true; // התחברות לשרת המיילים דורשת הזדהות
$mail->SMTPSecure = "ssl"; // מתחברים בהתחברות מאובטחת
$mail->Host = "smtp.gmail.com"; // כתובת השרת של גוגל
$mail->Port = 465; // פורט השרת של גוגל
$mail->Mailer= "smtp"; // מגדירים למחלקה לשלוח אימייל דרך השרת החיצוני ולא באמצעות פונקציות mail
$mail->SMTPDebug = true; // בפעם הראשונה נריץ את השליחה עם הודעות על מה הולך שם
// אחרי שנראה שהכל עובד - יש למחוק את השורה למעלה
// שם משתמש וסיסמה לחשבון
// CHANGE THIS !!!!!!!!!!!!!!!!!!!!!!!!!!
$mail->Username = "[email protected]";
$mail->Password = "YOURPASSWORD";
// מוען
$mail->FromName = "Mega admin"; // שם - השם שלך
$mail->AddReplyTo ("[email protected]", "Mega admin"); // אם המקבל ילחץ "השב" התשובה שלו תשלח ל
// תוכן ההודעה
$mail->Subject = "Mail subject"; // כותרת המכתב
$mail->Body = "Mail text"; // תוכן המכתב
$mail->IsHTML (true); // שולחים היפרטקסט ולא טקסט רגיל
$mail->CharSet = 'UTF-8'; // קידוד המכתב
// מען
$mail->AddAddress ("[email protected]", "Alex"); //כתובת אימייל אליה יישלח האימייל ושם הנמען
$mail->Send (); //ביצוע השליחה
רשמתי ליד כל שדה מה הוא אומר.
אפשר לשמור את הסקריפט, להריץ ולחקות שהאימייל שלכם יגיע כל רגע.
יש עוד אפשרויות מגניבות
לצורך העניין שליחת קובץ היא עכשיו עניין קלי קלות.
לאובייקט PHPMailer יש מטודה שנקראת AddAttachment שבעזרתה נוכל להוסיף קובץ או כמה קבצים שנרצה לאימייל.
$mail -> AddAttachment("C:/www/localhost/sendme.txt", 'somename.txt');
$mail -> AddAttachment("C:/www/localhost/sendme2.txt", 'somename2.txt');
$mail -> AddAttachment("C:/www/localhost/sendme2.txt", 'somename2.txt');
הפרמטר הראשון הוא מיקום הקובץ אצלכם בשרת, הפרמטר השני הוא השם שתחתו יראה המקבל את הקובץ. הם לא חייבים להיות זהים כלל.
Unable to find the socket transport "ssl" - did you forget to enable it when you configured PHP?
שגיאה נחמדה שיכולה לקרות לכם אם php מקונפג בלי הרחבת openssl.
כדי לתקן את המצב יש לפתוח את הקובץ php.ini , למצוא בו את השורה
;extension=php_openssl.dll
להוריד בתחילתה את הנקודה פסיק ולהפעיל מחדש את שרת ה-apache.
תגובות לכתבה:
ממש יפה! כל הכבוד לך על המדריך הזה :)
תודה... מקבל הודעת שגיאה :
SMTP Error: Could not connect to SMTP host.
מה לעשות?
טעות שלי... לא הפעלתי מחדש את Apache אחרי ששיניתי את הקובץ php.ini.
סליחה ותודה, אחלה מדריך!
אני רוצה לציין,
שאפשר לשלוח רק 100 אימיילים ביום
דרך ה API הזה,
קחו את זה בחשבון.
ואם אני רוצה להתקין את ה-PHPMAILER על שרת אחסון אתרים, צריך לשנות הגדרות איפשהו או פשוט להעתיק?
הרי אין על השרת את הקובץ php.ini
ניסיתי להתקין על שרת שתומך ב-PHP וב-SMTP אבל הוא מראה שגיאת התחברות לשרת SMTP.
phpmailer זה סתם סקריפט שאפשר להעתיק ולהפעיל.
אמנם בהנחה שהאיחסון תומך ב ssl
תודה על התשובה המהירה!
זה פועל גם על אחסון? או רק ב-WAMP?
מה ההבדל בין השניים?
חחח לא משנה P:
תודה
Unable to find the socket transport "ssl" - did you forget to enable it when you configured PHP?
למרות שאפשרתי ssl בשרת וריסטרתי את הapache, אני מקבל את השגיאה הזאת.
תנסה להתקין את PHP מחדש. יכול להיות שבהתקנה שלך פשוט אין את הקובץ php_openssl.dll
עובד
תודה רבה
כל הכבוד
זה שולח את המייל אבל זה כותב בדף של האתר את זה:
SMTP -> get_lines(): $data was ""
SMTP -> get_lines(): $str is "220 mx.google.com ESMTP n52sm35915971eea.5 "
SMTP -> get_lines(): $data is "220 mx.google.com ESMTP n52sm35915971eea.5 "
SMTP -> FROM SERVER:220 mx.google.com ESMTP n52sm35915971eea.5
SMTP -> get_lines(): $data was ""
SMTP -> get_lines(): $str is "250-mx.google.com at your service, [79.181.157.41] "
SMTP -> get_lines(): $data is "250-mx.google.com at your service, [79.181.157.41] "
SMTP -> get_lines(): $data was "250-mx.google.com at your service, [79.181.157.41] "
SMTP -> get_lines(): $str is "250-SIZE 35882577 "
SMTP -> get_lines(): $data is "250-mx.google.com at your service, [79.181.157.41] 250-SIZE 35882577 "
SMTP -> get_lines(): $data was "250-mx.google.com at your service, [79.181.157.41] 250-SIZE 35882577 "
SMTP -> get_lines(): $str is "250-8BITMIME "
SMTP -> get_lines(): $data is "250-mx.google.com at your service, [79.181.157.41] 250-SIZE 35882577 250-8BITMIME "
SMTP -> get_lines(): $data was "250-mx.google.com at your service, [79.181.157.41] 250-SIZE 35882577 250-8BITMIME "
SMTP -> get_lines(): $str is "250-AUTH LOGIN PLAIN XOAUTH "
SMTP -> get_lines(): $data is "250-mx.google.com at your service, [79.181.157.41] 250-SIZE 35882577 250-8BITMIME 250-AUTH LOGIN PLAIN XOAUTH "
SMTP -> get_lines(): $data was "250-mx.google.com at your service, [79.181.157.41] 250-SIZE 35882577 250-8BITMIME 250-AUTH LOGIN PLAIN XOAUTH "
SMTP -> get_lines(): $str is "250 ENHANCEDSTATUSCODES "
SMTP -> get_lines(): $data is "250-mx.google.com at your service, [79.181.157.41] 250-SIZE 35882577 250-8BITMIME 250-AUTH LOGIN PLAIN XOAUTH 250 ENHANCEDSTATUSCODES "
SMTP -> FROM SERVER: 250-mx.google.com at your service, [79.181.157.41] 250-SIZE 35882577 250-8BITMIME 250-AUTH LOGIN PLAIN XOAUTH 250 ENHANCEDSTATUSCODES
SMTP -> get_lines(): $data was ""
SMTP -> get_lines(): $str is "334 VXNlcm5hbWU6 "
SMTP -> get_lines(): $data is "334 VXNlcm5hbWU6 "
SMTP -> get_lines(): $data was ""
SMTP -> get_lines(): $str is "334 UGFzc3dvcmQ6 "
SMTP -> get_lines(): $data is "334 UGFzc3dvcmQ6 "
SMTP -> get_lines(): $data was ""
SMTP -> get_lines(): $str is "235 2.7.0 Accepted "
SMTP -> get_lines(): $data is "235 2.7.0 Accepted "
SMTP -> get_lines(): $data was ""
SMTP -> get_lines(): $str is "250 2.1.0 OK n52sm35915971eea.5 "
SMTP -> get_lines(): $data is "250 2.1.0 OK n52sm35915971eea.5 "
SMTP -> FROM SERVER:250 2.1.0 OK n52sm35915971eea.5
SMTP -> get_lines(): $data was ""
SMTP -> get_lines(): $str is "250 2.1.5 OK n52sm35915971eea.5 "
SMTP -> get_lines(): $data is "250 2.1.5 OK n52sm35915971eea.5 "
SMTP -> FROM SERVER:250 2.1.5 OK n52sm35915971eea.5
SMTP -> get_lines(): $data was ""
SMTP -> get_lines(): $str is "354 Go ahead n52sm35915971eea.5 "
SMTP -> get_lines(): $data is "354 Go ahead n52sm35915971eea.5 "
SMTP -> FROM SERVER:354 Go ahead n52sm35915971eea.5
SMTP -> get_lines(): $data was ""
SMTP -> get_lines(): $str is "250 2.0.0 OK 1330202618 n52sm35915971eea.5 "
SMTP -> get_lines(): $data is "250 2.0.0 OK 1330202618 n52sm35915971eea.5 "
SMTP -> FROM SERVER:250 2.0.0 OK 1330202618 n52sm35915971eea.5
איך אפשר להעלים את זה???
ויש לי עוד שאלה
איך אפשר לעשות שיהיה אפשר לשלוח יותר מ-100 אימיילים ביום (אם זה אפשרי)???
תודה רבה על העזרה!!!!!!!
שחכתי להפוך את הSMTPDebug = true;
לFALSE
אני מאחסן ב godaddy ומקבל שגיאת חיבור
שמע אלכס, אתה אחד התותחים!
אני יושב על זה כבר איזה שעתיים, באתרים בחו"ל.
לא האמנתי שיש מצב שבעברית אקבל את הפיתרון.
אחי, רק זה עבד לי!
ניסיתי כבר הכל.
פשוט מלך!
מאסף לירן
www.attract.co.il
שמח שעזרתי.
לא עובד לי, מודיע הודעה: SMTP -> ERROR: Failed to connect to server: Unable to find the socket transport "ssl" - did you forget to enable it when you configured PHP? (42737496)
SMTP Error: Could not connect to SMTP host.
אני חדשה בזה, אשמח לתשובה
נ.ב. ניסיתי להתקין מחדש WAMP, לא עזר
תקרא את המדריך עד הסוף בבקשה...
יייייייישששששששששש, זה עובד!! צודק, לא קראתי עד הסוף כי לא הייתי מעוניינת בצירוף קובץ אז לא התייחסתי להמשך. תודה וסליחה
למה זה לא עובד , האם יש משהו עדכני יותר
מישהו נתקל בבעיית קידוד?
בהתחלה רק גוף ההודעה היה מקודד בסדר והפיע במייל בעברית קריאה. הכותרת ושם השולח (זה שמוגדר בצמוד למייל השולח) הופיעו בג'יבריש.
אחרי שהוספתי את השורה שמגדירה את ה- CharSet שם השולח עבר לעברית אבל הכותר עדיין מופיעה בג'יבריש ומסרבת להיות קריאה.
קבצי ה-php שלי שמורים כ- charset=CP1255.
יש רעיונות?